Technical Note TN2075
Power Management for Macintosh; getting started

目次

電源管理は、Mac OS X と Mac OS 9 の一部であり、コンピュータによるスリープとその解除、アプリケーションやドライバによる電源イベントの登録などを実現するための手段となります。

しかし、これに関連するすべての資料をどこで探したらよいでしょうか?

このテクニカルノートの目的は、さまざまな電源管理関連のヘッダファイル、ドキュメント、Darwin ソース、コードサンプル、デベロッパが利用可能な開発キットなどを見つける手助けをすることです。

[2003 年 5 月 30 日]



電源管理ヘッダファイルの場所

電源管理機能を使う Mac OS X アプリケーションを開発している場合は、次に示す絶対パスに、必要なヘッダファイルがあります。

/System/Library/Frameworks/IOKit.framework/Versions/A/Headers/pwr_mgt(図 1 参照)。Mac OS X 用の Power Management DDK に、このカテゴリのヘッダファイルの使い方を示すさまざまなサンプルが含まれています。UNIX、Cocoa、Carbon の環境で開発している場合は、これらのヘッダファイルを使用してください。

しかし Carbon を使っている場合は、このほかにもう 1 つ、「power.h」という Mac OS 9 のヘッダファイルが必要になります。このヘッダファイルは次に示す絶対パスにあります。

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

Power Management User Headers

図 1. 電源管理のユーザヘッダ



電源管理を使用するカーネル内のデバイスドライバ (KEXT) を開発している場合は、必要なヘッダファイルは、次の 2 つの絶対パスにあります。API は「IOService.h」に含まれています。

/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/IOKit/IOService.h(図 3 参照)
/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/IOKit/pwr_mgt(図 2 参照)

Power Management Kernel Headers

図 2. 電源管理のカーネルヘッダ





More Power Management Kernel Headers

図 3. 追加の電源管理カーネルヘッダ



先頭に戻る



Darwin の電源管理ファイルの場所

電源管理を扱う Darwin のサブプロジェクトには、IOKitUser、PowerManagement、xnu の 3 つがあります。

IOKitUser/pwr_mgt サブプロジェクト(http://www.opensource.apple.com/darwinsource/10.2.6/IOKitUser/pwr_mgt.subproj/)には、ユーザ空間の API とサンプルアプリケーションが含まれています。

PowerManagement サブプロジェクト(http://www.opensource.apple.com/darwinsource/10.2.6/PowerManagement/)には、ユーザ空間のバックエンドのサポートが含まれています。このプロジェクトには API はありませんが、サブプロジェクトに pmset のソースコードが含まれています。

xnu サブプロジェクト(http://www.opensource.apple.com/darwinsource/10.2.6/xnu/iokit/IOKit/pwr_mgt/)には、カーネルインタフェースが含まれています。

先頭に戻る



電源管理開発キットの場所

図 4 に示すように、電源管理開発キットは 2 つあり、1 つは Mac OS X 用、もう 1 つは Mac OS 9 用です。次の URL を使用して、これらのキットを見つけてください。

(http://developer.apple.com/sdk/index.html )

Power Management Development Kits

図 4. 電源管理開発キット



先頭に戻る



電源管理関連ドキュメントの場所

電源管理については、「Inside Mac OS X:I/O Kit Fundamentals」の 10 章に説明があります。このドキュメントは、http://developer.apple.com/ja/documentation/pdf/IOKitFundamentals_j.pdf にあります。また、Developer SDK にも含まれています。Developer SDK がインストールされている場合は、次のパスを使ってこのドキュメントを探すことができます。

/Developer/Documentation/Darwin/IOKit/IOKitFundamentals

先頭に戻る



電源管理ツールの場所

電源管理関連パラメータを読み書きするための OS X ツールが多数あります。これらのツールは、Power Management OS X DDK に含まれています。ここでは、pmset と SleepCycler という 2 つの重要なツールについて取り上げます。

pmset は、「システム環境設定」の「省エネルギー」を迂回するコマンドラインツールです。このツールは root として実行され、テストを目的としています。詳しくは man ページを参照してください。以下は、man ページからの機能説明を抜粋したものです。

「pmset は、スリープするまでのアイドル時間、管理者のアクセスによってスリープを解除するかどうか、停電後に自動的に再起動するかどうかなど、電源管理関連設定の変更と読み込みを実行します」

SleepCycler は、コンピュータを「起動」(つまり「スリープ解除」)の状態から「スリープ」(または「ディープスリープ」をサポートしていないコンピュータでは「ドーズ」)の状態に継続的に循環させるアプリケーションです。

SleepCycler は元々 Mac OS X 上で電源管理システムソフトウェアのストレステストを実施するために設計されました。デバイスドライバの電源管理の動作だけでなく、システム全体の動作についてのストレステストも実施するので、この SleepCycler も有用です。

先頭に戻る



電源管理と開発環境

開発環境(Carbon、Cocoa、カーネル、UNIX)に関係なく、Mac OS X 用の Power Management DDK には、導入のための簡単なサンプルがいくつか用意されています。DDK をインストールすると、「Register for Sleep」というフォルダにサンプルが置かれます(図 5 参照)。要件に合った正しいコードを簡単に選べるように、サンプルは、各種の開発環境に対応したサブフォルダの中に配置されています。

Sleep Examples

図 5. スリープのサンプル



サンプルはすべて同じ内容を実行します。これらのサンプルは、スリープ情報を登録して、コールバックルーチンを提供します。環境に関係なく、これらのサンプルは、サンプルを素早くビルドするために必要なフレームワーク、ヘッダファイル、その他のコントロールを提供します。DDK をダウンロードして、これらのサンプルを調べてください。



注:
RegisterforSleepfromKext のサンプルは、現在、HelloIOKit チュートリアルのバージョンに追加しているところであり、近いうちに公開されますので、もうしばらくお待ちください。それまでの間、コードスニペットについては「I/O Kit Fundamentals」の 10 章を調べてください。



先頭に戻る



電源管理の基本的解決策

ここでは、DTS Engineering に寄せられた電源管理関連の質問事項に基づいて、開発サイクル中によく見られる状況をいくつか取り上げます。

先頭に戻る



Carbon と 2 つの電源マネージャ

Carbon 向けの開発を行っている場合は、Mac OS X の電源管理のヘッダと、Mac OS 9 のヘッダがあることを認識しておく必要があります。これらは同じものではありません。その他の開発環境では、Mac OS X のヘッダのみ必要となります。Carbon の「power.h」ヘッダは内容が古く、Mac OS X ではまったく実装されていませんが、Mac OS 9 には必要です。

先頭に戻る



ポリシーメーカーと電源コントローラ

「I/O Kit Fundamentals」の 10 章に、この 2 つの用語の意味と、これらがどのようにやり取りしているかを詳しく解説しています。しかしここでは導入に役立つように簡単に説明します。この 2 つの実体はカーネル内に存在しますが、ポリシーメーカーには、図 6 に示す「システム環境設定」の「省エネルギー」にユーザとのインタフェースとなる部分があります。

Energy Saver System Preferences.

図 6. 「システム環境設定」の「省エネルギー」



ユーザは、「システム環境設定」の「省エネルギー」を使ってポリシーメーカーとやり取りして、エネルギー関連の環境設定を設定します。電源コントローラは、KEXT 内にあり、ポリシーメーカーから命令を受け取ります。その「命令」は、スリープなどの電源イベントからなります。ポリシーメーカーを実装することはまずありませんが、デバイスドライバを開発している場合は、電源コントローラを実装する必要があります。これは、安全にスリープ状態にできるように、デバイスから電源を切る方法を認識しているのが、デバイスドライバだけであるためです。「I/O Kit Fundamentals」の 10 章を読むときには、ポリシーメーカーの情報については軽く目を通し、電源コントローラの情報に集中するのもよいでしょう。

先頭に戻る



スリープはスリープ。サスペンドやシャットダウンとは異なる

DTS Engineering では、UNIX や Windows のバックグラウンドを持つデベロッパが、従来からの Macintosh デベロッパが使っているのとは異なる用語を「スリープ」に対して使うことがあると認識しています。便宜上、SleepCycler のヘルプにあるスリープの定義を以下に示します。SleepCycler は、Mac OS X の Power Management DDK の中に含まれています。

現在 Mac OS X では、2 つの異なる形式のスリープをサポートしています。完全なスリープ(ディープスリープ)と、浅いドーズの 2 つです。

一般に、電源管理機能を完全にサポートしているコンピュータはスリープになり、そうでないコンピュータはドーズになります。

スリープ状態では、PMU(電源管理ユニット)のような最低限必要なものを除き、CPU を含むほとんどすべてのハードウェアがサスペンド/電源オフの状態になります。つまり、プロセスはスケジューリングも実行もされないということです。

Mac OS X を正式にサポートしている大部分のコンピュータはスリープを実行できますが、初期の iMac(スロットローディング以前)と、ブルー/ホワイト、ベージュの G3 などの一部のコンピュータは、スリープ機能を完全にはサポートしていないため、ドーズになります。

ドーズモードでは、(ドライバから報告されたとおりの)電源管理を実行できるデバイスはすべてサスペンド状態になりますが、電源管理に対応していないものはサスペンド状態にならず、このためコンピュータ全体としてはスリープになりません。

OS は、残りのデバイスのうち、できる限り多くのデバイスの電源を切りますが、CPU は実行を続けます。このためプログラムは依然として積極的にスケジューリングされ、実行されます。

先頭に戻る



このコンピュータがスリープにならない理由は?

コンピュータがスリープ状態にならない理由として考えられるものはいくつかあります(詳しくは、OS X の Power Manager DDK を参照してください)。しかしこれらの理由はすべて、1 つの広いカテゴリに分類されます。それは、マルチタスク環境のほかのイベントによるアクティビティです。アプリケーションとハードウェアをデバッグする場合は、影響を受けない環境から行ってください。つまり、(できれば)「省エネルギー」のすべての設定をオフにし、不要なアプリケーションは立ち上げないでください。余分なアプリケーションはアクティビティのタイマーを「刺激する」可能性があり、それが原因でコンピュータがアイドルスリープになるのを妨げることがあります。

先頭に戻る



デスクトップカバーは閉じておく

PCI デバイスのデバッグ中は、デスクトップカバーは閉じておきます。たいていは、エンクロージャを開いておいて、PCI デバイスの LED の点灯を見たくなります。デバッグ中に、反応を目で確認できるのは素晴らしいことです。しかし、「一部の」コンピュータのエンクロージャにはセンススイッチがあり、エンクロージャが開いていると、このセンススイッチによって電源管理が機能しなくなることをご存知でしたか?これは、エンクロージャが開いているために、「スリープ」コード行の実行時に発生するものと期待されているスリープイベントが、電源管理機能によって無視されることを意味します。エンクロージャを開くと、ハードウェアの熱センサーの動作を妨げ、電源管理機能がスリープイベントを無視する原因になることがあります。

先頭に戻る



スリープ解除中に PCI デバイスのパニックが発生する

これは通常、デバイスが電源イベントを登録していないためです。スリープイベントが発生すると、PCI バスの電源が切られるため、スリープ解除イベントの発生時にデバイスを再度初期化することが必要になります。

先頭に戻る



これから進む方向

2 つ考えられます。順番は関係なく、「I/O Kit Fundamentals」の 10 章を試してみてください。Power Manager DDK もまた、サンプル、ツールなどのもう 1 つのソースです。

みなさまの開発が成功されることをお祈りしております。DTS Engineering